\part{Network}

\chapter{Overview}


计算机网络是把数据从一个地方传送到另一个地方的硬件和软件的组合。


\begin{compactitem}
\item 网络硬件把信号从网络中的一个节点传送到另一个节点；
\item 网络软件用于使用户可以使用网络服务。
\end{compactitem}

网络的性能可以用多种方式来衡量，例如传输时间、响应时间等。

\begin{compactitem}
\item 传输时间是信息从一个设备传输到另一个设备所需的时间总量。
\item 响应时间是查询和响应之间的时间间隔。
\end{compactitem}

网络的性能依赖于许多因素，例如用户数、传输介质类型、硬件的连接能力和软件的效率等。

除了发送的准确性之外，还可以从发生故障的频率、从故障中恢复的时间、灾难时网络的健壮性等因素来衡量网络的可靠性。

网络的安全问题包括数据保护、防范非授权访问、破坏和修改，实现从数据破坏和数据丢失中恢复的策略和程序等。

\section{Connection}

链路是数据从一个设备传输到另一个设备的通信信道，可能的连接类型包括点对点连接和多点连接。

\begin{compactitem}
\item 点对点连接提供了两个设备间的专用链路，而且链路的整个容量为两个设备的传输所拥有。
\item 多点连接（或多站连接）是两个以上的指定设备共享一个链路，因此信道的容量被共享。
\end{compactitem}

\section{Topology}

网络的拓扑是所有链路和设备（通常为节点）间关系的几何表示，可以划分为网状型、星型、总线型和环型等拓扑结构。

实际上，网络的物理拓扑都是两个或多个设备连接到一个链路，一个或多个链路形成拓扑。

\begin{compactitem}
\item 在网状拓扑中，每个设备都有专用的点对点链路与其他每个设备相连。
\item 在星型拓扑中，每个设备都有专用的点对点链路，只与集线器（Hub）相连。
\item 在总线拓扑中，所有的设备都连接到总线，而且每个节点使用分支线和连接器与总线相连。
\item 在环形拓扑中，每个设备都有专用的点对点链路，并且只与两边的设备相连，信号只是以一个方向沿着环从一个设备传输到另一个设备，直到到达目的地。
\end{compactitem}

在环形拓扑中，环中的每个设备连接一个中继器（Router），这样当一个设备收到要发送到另一个设备的信号时，中继器可以重新生成二进制位并传输它们。

星型拓扑比网状拓扑更便宜，而且具有网状拓扑的大多数优点，只是其整个拓扑依赖单个点（即集线器）。

\begin{compactitem}
\item Hub仅仅将所有某台计算机的Frame再次发送给网络中的所有其他计算机，而且共享带宽。
\item Switch可以记录Switch Port与其连接的计算机的MAC地址，这样Frame就不再需要CSMA/CD监听直接就发送到目标计算机中，而且Switch的每个端口拥有独立带宽。
\end{compactitem}

Hub/Switch可以通过Auto-negotiation（即N-Way）和Auto MDI/MDIX技术来向下兼容不同的的网卡和网线，而且Switch通过端口直连解决了数据包冲突问题，而且支持全双工的Switch可以实现传送和接收使用独立的带宽

\begin{compactitem}
\item Auto-negotiation技术检测并协调网卡传输速度；
\item Auto MDI/MDIX技术自动检测并行线和串行线。
\end{compactitem}

\section{Router}



当两个或多个网络通过路由器连接在一起时，它们就变成了互联网（internet），其中最著名的互联网就是因特网（Internet）。

路由器（Router）是发送数据包（packet，消息），并使其在互联网中传输的连接设备。

\begin{compactitem}
\item 网络本身可以是一组连接在一起的通信设备（例如计算机和打印机）。
\item 互联网本身是能够通过路由器进行互相通信的两个或多个网络。
\item 路由器只使用TCP/IP协议族的前三层（不需要传输层）。
\end{compactitem}

路由器选择协议（例如RIP、OSPF和BGP）向Internet上的所有路由器发送自己的信息，更新它们关于路由的信息，因此路由选择协议可以更新路由器中的路由表。

\chapter{OSI}


\section{Overview}

网络传输是分层架构的，每个分层（layer）可以是独立的，而且每个分层也可以有自己的标准，这样用户就可以在不同的分层中根据相应的标准来设计。

OSI（Open System Interconnection）七层协议为网络分层提供了一个参考模型。

\zihao{6}
\begin{longtable}{|m{60pt}|m{330pt}|}
\multicolumn{2}{r}{}
%\tabularnewline\hline
\tabularnewline
分层 & 说明
\endhead

\caption{OSI参考模型}\\
\hline
\endfirsthead

\multicolumn{2}{r}{}
\endfoot

\endlastfoot

\hline
Physical Layer & 网络硬件标准（网线、无线、设备、电压以及规则等）\\
\hline
Data Link Layer & Frame的数据格式、错误控制、流量控制、错误校验以及传输方式等\\
\hline
Network Layer & 计算机之间建立、中止、维持连接以及数据包的传输路径选择，而且可以涵盖实体层和数据链路层。\\
\hline
Transport Layer & 发送端与接收端的连接技术（例如TCP），以及数据包的格式、传输、控制、检测和重新发送等。\\
\hline
Session Layer & 两个地址之间的连接信道的连接和挂断，以及应用程序之间的会话控制、网络管理、签到签退等。\newline 如果传输层判断数据包是否正确到达目标，那么会话层则是确定网络服务建立连接的确认（例如3次握手）\\
\hline
Presentation Layer &将本地应用的数据的格式转换（或者重新编码）为标准格式来发送给更具体的层进行处理。\\
\hline
Application Layer & 使用程序（例如浏览器、数据库系统、Email系统等）来定义文件的读取、复制、打开和关闭等。\\
\hline
\end{longtable}
\zihao{5}

\chapter{Protocol}

下面的示意图说明了TCP/IP协议族中每层的职责和每层涉及的地址。

\begin{table}[htbp]
\centering
\begin{tabular}{l|l|c|l}
\hline
应用层&消息 & \fbox{进程} & 应用层地址\\
\hline
传输层&段、用户数据报或包 & \fbox{SCTP}~\fbox{TCP}~\fbox{UDP} & 端口号\\
\hline
网络层 &数据报 & \fbox{IP和其他协议} & IP地址\\
\hline
数据链路层&帧 & \fbox{LAN、WAN和MAN协议} &链路地址\\
\hline
物理层 & 位 & \fbox{把位转换为信号} & \\
\hline
\end{tabular}
\end{table}

\begin{compactitem}
\item 应用层使用户能够访问网络，其地址特定于应用程序，进程交换信息；
\item 传输层负责整个消息的进程到进程的分发，在客户端和服务器端之间创建逻辑连接，其数据单元被称为段（TCP）、用户数据报（UDP）或包（SCTP）；
\item 网络层负责并保证数据包从源到目的地的发送，实际上可能会经过多个网络，其数据单元被称为数据报（datagram）；
\item 数据链路层使用物理或MAC地址来标识节点，并且从一个节点到另一个节点发送数据包，以及负责“跳”之间的差错控制和流量控制，其数据单元被称为帧（frame）；
\item 物理层负责在物理介质上传输二进制流，其数据单元是二进制位，这样物理层通过传送单个的二进制位来使数据帧能到达下一个节点。
\end{compactitem}

不同的分层都对数据进行了封装，越具体的层都会将头（或有可能是尾）加到数据单元中。

通常情况下，尾只在第二层被加入，并且在格式化的数据单元经过物理层时被转换为电磁信号，然后沿着物理电路进行传输。

当数据到达目标计算机后就会反向经过各层，当每个数据块到达下一个更高层时，在相应发送层附加上去的头和尾都被移除，并且执行当前层相应的动作，到达最高层时将会被转换为适合应用的形式（即对接收者可用）。

在层中数据单元之间的关系不是一对一的，例如在TCP中将会把消息分解为几个部分，每个部分封装在一个段中，但是UDP中的每个消息将被封装在一个用户数据报中，因此发送给UDP的消息必须足够小，才能保存在一个数据报中。

当段或用户数据报用数据报封装时，情况与上述相同，而且网络层中的数据报也可以分解为数据链路层中的多个帧。






\section{TCP}


使用计算机解决问题的基础工作是由硬件完成的，用户通过软件可以控制问题求解过程，硬件工作的细节问题由软件层处理。

计算机网络提供的服务也可以类比于解决问题，例如发送电子邮件的任务可以被分解为更小的子任务。

实际上，计算机网络的每层完成一个任务，而且每层都使用更低层的服务。

在计算机网络的最底层，信号或信号组被从源计算机传送到目的计算机，这也是网络协议的最底层。

计算机网络协议允许使用不同技术的LAN和WAN互相连接到一起，从而可以从一点向另一点传送信息。

原始的TCP/IP协议族被定义为4层，分别是主机到网络层（或链路层）、互联网层（网络层）、传输层和应用层，现在已经发展为5层。

\begin{table}[htbp]
\centering
\caption{TCP/IP协议族}
\begin{tabular}{|l|l|l|l|l|}
\hline
	& 应用层 & 5 & 应用层 & \\ \cline{2-4}
	&传输层 & 4 & 传输层 & \\ \cline{2-4}
TCP/IP&网络层 & 3 & 互联网层 & 原始的TCP/IP\\ \cline{2-4}
	&数据链路层 & 2 & 主机到网络层 & \\ \cline{2-4}
	&物理层 & 1 & & \\
\hline
\end{tabular}
\end{table}

在网络协议分层结构中，每一层调用其直接下层的服务，路由器只使用TCP/IP协议族的前三层。

应用层允许用户（人或者软件）访问网络，并提供对电子邮件、远程文件访问和传输、浏览Internet等服务的支持。

应用层负责向用户提供服务，而且应用层是唯一一个大多数Internet用户能够直观感受的层。例如，客户/服务器体系结构和对等体系结构都可以用于允许不同计算机上的应用程序互相通信，它们都需要应用层的支持。

在客户/服务器体系结构中，每个应用由两个分开但相关的程序（客户端程序和服务器端程序）组成。

\begin{compactitem}
\item 客户端程序只在需要时运行。
\item 服务器端程序需要一直运行。
\end{compactitem}

客户端程序和服务器端程序之间的通信称为进程到进程的通信，其中服务器端进程一直运行，并等待接收客户端进程的请求。

用户运行休眠的客户端程序就可以将其转变为客户端进程，使得客户端进程请求服务，而且将被服务器端进程响应。

一般情况下，服务器端进程可以响应多个客户端进程的请求并返回数据。

网络层负责源到目的地的数据包发送，实际上可能需要跨越多个网络（链路），并且网络层保证每个数据包从源点到最终目的地。

除了多路复用和解多路复用以外，期望从网络层得到的服务和传输层服务相似，但是实际上在Internet中实现拥塞控制、流量控制和差错控制并不现实。



\section{IP}

在TCP/IP协议族中，网络层的主协议IP（因特网协议）用于从源计算机到目的计算机的数据包发送，可以将IP地址想象为“门牌号码”。



IP地址使用点分十进制记法表示的32位的地址标识，32位的地址被分解为4个8位的部分，每个部分写成0～255的十进制数，这样IPv4（32位）的地址范围可以定义$2^{32}$（超过40亿）个不同的设备。

在消息的源头，IPv4协议把源和目的的IP地址加到从应用层发送过来的数据包中，然后将数据包放入缓冲区准备发送，实际的传输是由数据链路层和物理层来实现的。

从客户端到服务器端的数据包和从服务器端到客户端的数据包都需要网络层地址，而且网络层使用其路由表来找到下一跳（路由器）的逻辑地址，然后把这个地址传递给数据链路层。

\begin{compactitem}
\item 服务器的地址由服务器提供；
\item 客户端地址是客户端计算机提供的。
\end{compactitem}

当客户需要向服务器发送请求时，首先需要服务器应用层的地址，而且服务器应用层地址不能用来发送消息的，它只是帮助客户找到服务器的实际地址，数据链路层使用逻辑地址来找到下一个路由器的数据链路层地址。


在现实生活中，邮局并不保证用户的信件一定被收件人收到，因此IP协议提供的尽力而为服务，不保证数据包准确无误到达或顺序是发送者希望的，也不保证任何数据包都被发送，数据包有可能丢失。如果需要确保数据准确无误地发送到目的计算机，那么就需要使用可靠传输协议（例如TCP）或用户本身实现差错控制来补充IP提供的服务。

实际上，IP使用其他的协议来在一定程度上弥补其不足，例如：

\begin{compactitem}
\item ICMP（Internet控制消息协议）可以用来报告一定数目的差错给源计算机。
\item IGMP（Internet小组管理协议）可以用来增加IP的多播能力。
\item ARP（地址解析协议）和RARP（反向地址解析协议）
\end{compactitem}

事实上，Internet使用IP进行连接，但是硬件数据使用帧来作为最小单元进行传输，因此需要通过ARP（Address Resolution Protocol）来解析MAC和IP地址的对应关系。例如，当主机在查找目标IP时就会对整个局域网进行广播数据包（boardcast）的发送，这样就可以要求局域网内的所有主机回复它们的IP和MAC。

\begin{compactitem}
\item 目标主机可以响应广播数据包，响应相关的MAC信息，以及更新主机内存中的ARP table。
\item 非目标主机主动忽略广播数据包。
\end{compactitem}

ARP table是动态的信息，随时随着网段中的计算机的变化而改变，不过也可以设置静态的ARP对应。


在网络拥堵时，路由器丢失数据包后可以由ICMP发送一个数据包给源计算机来警告其拥堵，而且ICMP还可以用来检查Internet节点的状态。

从本质上来说，IP是单播传输的协议，一个源，一个目的地，而多播传输则是一个源，多个目的地，因此通过IGMP来增强IP的多播能力。

在应用层，客户端位置不需要进行标识，不同的服务器有不同的应用层地址。举例来说，在只知道一个人的姓名时无法向其发送信件，邮局无法仅凭姓名投递信件，还需要收信人的实际地址。

应用层地址可以帮助客户端通过路由算法来找到服务器的实际地址（也就是服务器的IP地址），路由选择是网络层的特殊职责。

\begin{quote}
\textsl{路由选择是指确定数据包的部分或全部路径，而且路由选择的决定是由每个路由器作出的。}
\end{quote}

Internet是网络（LAN、WAN和MAN）的集合，从源到目的地的数据包发送可能是多个发送的组合（例如源到服务器的发送、路由器之间的发送），最后是路由器到目的地的发送。

如果把Internet中的数据包的发送和使用常规邮局服务的信件发送进行比较，可能发现信件的发送者可能使用不同的路径来传递信件，但是最后总能将信息发送到信件的接收者，因此路由选择可能会改变数据包的传递路径，但是源地址和目的地址没有改变。

路由基于目的地址和可用的最佳路径进行选择，而且网络层的路由选择情况是相同的。例如，当一个路由器接收到一个数据包时，它检查路由表并决定该数据包到最终目的地的最佳路线，路由表中提供了下一个路由器的IP地址。当数据包到达下一个路由器时，下一个路由器将会再作出新的决定。

从一个节点到另一个节点传送数据是数据链路层的职责，源计算机使用数据帧封装数据包，在包头增加路由器的数据链路层地址作为目的地址，然后使用广播方式发送数据包。

客户端进程是通过DNS服务器来找到服务器的IP地址的，DNS服务器包含将域名匹配到IP地址的目录，这样当客户端准备和发送信息到DNS服务器时，需要知道其所需要的服务器的实际IP地址，DNS通过逐级查找来获取结果，否则返回错误消息。

\begin{quote}
\textsl{数据传输层负责数据帧的节点到节点的传输，并且使用静态或动态进程来找到下一跳（路由器）的数据链路层地址。}

\textsl{传输层负责客户和服务器之间进程到进程的消息的传输，并建立客户和服务器的传输层的逻辑通信。或者说，传输层负责端到端的数据发送。}
\end{quote}


与IP地址不同，数据链路层的地址不是通用的，每个数据链路层协议可能使用不同的地址格式和大小，而且一个设备可以静态或动态地找到另一个设备地数据链路层地址。

\begin{compactitem}
\item 在静态方法中，设备创建两列的表来存储网络层和数据链路层地址对。
\item 在动态方法中，设备可以广播一个含有下一个设备IP地址的特定数据包，并使用该IP地址询问邻近节点，邻近节点返回它的数据链路层地址。
\end{compactitem}

数据链路层地址经常被称为物理地址或MAC（介质访问控制）地址，其中在Ethenet（以太网协议）中使用48位地址，通常写成十六进制格式（分成6部分，每部分使用两位十六进制数），例如：
\[00:1E:EC:1E:25:AE\]

用户可以将网线想象为一条“一次仅可通过一个人”的独木桥，在数据链路层中传输的帧（frame）就是在网络硬件上传输数据的最小单位，下面的示意图说明了以太网MAC帧的内容。

\begin{table}[htbp]
\centering
\caption{以太网的MAC帧}

\begin{tabular}{|c|c|c|c|c|c|}
\hline
前导码 & 目的地址 & 来源地址 & 数据域位通信 & 主要信息 & 校验码 \\
8Bytes & 6Bytes & 6Bytes & 2Bytes & 46～1500Bytes & 4Bytes\\
\hline
\end{tabular}
\end{table}

帧的标准容量最大可达1500Bytes，IP数据包的最大可以达到65535Bytes，因此操作系统需要将需要传输的数据拆解为多个1500Bytes的帧来进行发送，并且在目标主机接收到帧后再重新组合为原始数据，不过现在的Gigabit Ethernet已经开始支持更大的帧架构Jumbo Frame（通常为9000Bytes）。

在MAC帧中的目的地址和来源地址实际上是硬件地址，长度为6Bytes，范围为00:00:00:00:00:00～FF:FF:FF:FF:FF:FF，MAC帧仅在局域网内生效，不能跨路由器进行传输，在跨网段传输时需要路由器来修改来源地址和目的地址，。

\begin{compactitem}
\item 前3Bytes为厂商代码；
\item 后3Bytes为厂商自行设置的设备码。
\end{compactitem}



有些数据链路层协议在数据链路层使用差错控制和流量控制，方法和传输层相同，不过只是在节点发出点和节点到达点之间实现，因此差错会被检查多次，但是没有一个差错检查覆盖了路由器内部可能发生的差错。

在客户端和服务器端交互时，物理通信是两个物理层之间的（通过许多可能的链路和路由器），传输层可以实现多路复用和解多路复用、拥塞控制、流量控制和差错控制，因此应用层把传输层看作是负责消息传输的代理。

由硬件实现的物理层负责在物理介质上传输二进制流，因此在数据链路层传送的单元是帧，在物理层传送的单元则是二进制位。例如，以太网中的8蕊线只有1、2、3、6蕊在实际使用（一对用于发送，一对用于接收），其他的只在某些特殊用途的场合才能用到，而且网络共享介质（例如网线和交换机等）在某一时刻只能被单台设备使用。





物理层不需要地址，帧中的每个位被转化位电磁信号后将通过物理介质（无线或线缆）以广播形式进行传送，因此与发送设备相连的其他设备都能接收到物理层发送的信号。例如，在局域网中，当某台计算机或路由器发送信号时，所有其他的计算机和路由器都将接收到信号。

\begin{compactitem}
\item 数据链路层负责节点之间的帧传送；
\item 物理层负责组成帧的单个二进制位从一个节点到另一个节点的传送。
\end{compactitem}

在传输数据时，每发出一个帧都会使用以太网CSMA/CD（Carrier-Sense Multiple Access with Collision Detection）监听技术来使节点预先侦测是否有其他节点正在使用，并且在节点开始传输数据的同时检测信号冲突。

在实际生产环境中，服务器可能同时运行多个进程（例如FTP服务器进程和HTTP服务器进程），因此除了服务器的IP地址之外，还需要更多因素来实现计算机通信。

当消息到达服务器时，它必须被指向正确的进程，因此用户需要另一个地址（即端口号）来标识服务器进程，而且传输层的职责之一就是多路复用和解多路复用。这里，可以使用类比来说明端口号作为传输层的地址的作用。

假定用户生活在大楼里的不同公寓中，为了向特定的人投递邮件，需要知道大楼的地址和公寓的号码。

\begin{compactitem}
\item IP地址和大楼地址相似；
\item 端口号和公寓号码类似。
\end{compactitem}


端口号是唯一的，而且大多数计算机都包含规定了服务器端口号地址的文件（例如/etc/services），客户端端口号可以由运行客户端进程的计算机临时指定\footnote{Internet对临时端口号的范围进行了限制，以避免破坏通用端口地址范围。}。

\begin{compactitem}
\item 服务器进程使用统一的端口号；
\item 客户端进程使用传输层指定的临时端口号。
\end{compactitem}



在邮件发送和投递的过程中，邮递员无法从每个用户那里收集邮件再把每个邮件分发给目标用户，因此通常就需要由传达室来处理邮件的收集和分发。例如，传达室可以从用户那里统一收集要发出的邮件，然后把它们统一交给邮递员（多路复用），并且还可以把从邮递员手中收集来的邮件逐一分发给用户（解多路复用）。

实际上，传输层为不同的进程做相同的工作，它从进程中收集要发出的信息，并将到达的信息再分发给进程，并且传输层使用端口号（与传达室使用的公寓号码相似）完成多路复用和解多路复用。



另外，物理上传送数据包的下层网络可能发生拥塞，从而导致网络丢失一些数据包，因此传输层还负责实现拥塞控制。例如，有些协议可以为每个进程使用缓冲区，消息在发送前存储在缓冲区中，并且在传输层检测到网络拥塞时暂缓发送，其原理与交通信号灯的效果相似。


传输层在实现流量控制时，发送端的传输层能监控接收端的传输层，并检查接收者发回的确认信息来确定接收者接收到的数据包是否过量。在实现时，接收端确认每个数据包或一组数据包，从而就允许发送者检查接收者接收到的数据包是否过量。

在消息的传输过程中，不可避免地可能发生损坏、丢失、重复或乱序，因此传输层还负责确保消息被目的传输层正确接收。

传输层在提供差错控制时，一般都是在缓冲区（临时存储）中保留消息的副本，直到它从接收者那里接收到数据包无损到达和次序正确的确认信息。如果在预期的时间内没有确认到达或有否定确认（表示数据包被损坏）到达，那么发送者就重新发送数据包。

为了能够检查包的次序，传输层给每个包加上了次序号，给每个确认加上了确认号。


\section{UDP}


TCP/IP协议族中定义了三种传输层协议：UDP、TCP和SCTP。

\begin{compactitem}
\item UDP（用户数据报协议）是传输层协议中最简单的。
\item TCP（传输控制协议）是支持传输层所有职责的协议。
\item SCTP（流控制传输协议）结合了UDP和TCP的优点。
\end{compactitem}




UDP实现多路复用和解多路复用（通过给数据包增加源和目的端口号），而且给包增加校验和来进行差错控制，不过在这种情况下的差错控制只是“是或否”的过程，接收者重新计算校验和，检查在传输中是否有差错发生。

如果接收者确认接收的数据包被损坏，也只是简单地丢弃这个包，并不会通知发送端重新发送，因此UDP不是完美的协议，仅仅在其他职责不是传输层所需要的，或者这些职责已经由应用层完成时才非常有用。

另一方面，UDP的简单使其具有速度快的优点，而且效率高，因此UDP还适合用于及时性比准确性更重要的应用中。例如，在处理视频实时传输时可以使用UDP来实现图像的数据包准时到达，并且图像中小的瞬时错误并不影响用户的观看，因此允许少量的数据包被丢弃或损坏。

与其他协议相比，UDP传送更少的额外信息，而且有些应用程序（例如DNS服务器）使用UDP时可以自己来完成流量控制或差错控制，或者实现快速高效的响应。

UDP被称为无连接协议，不提供属于单个消息的数据包之间的逻辑连接，而且UDP中的每一个包都是一个单独的实体。

类似于常规邮件系统提供的服务，假定用户需要发送一组有次序的包到目的地，UDP（或邮局）不能保证它们按照需要的次序分发，因此用户可以只关心包是否是单独的实体，与其他包没有关系。

TCP（传输控制协议）支持传输层所有职责，但是它没有UDP快速和高效。

TCP使用序号、确认号和校验和，而且TCP在发送端使用缓冲区，以及支持多路复用、解多路复用、流量控制、拥塞控制和差错控制等。

与UDP不同，TCP在两个传输层之间提供逻辑连接，因此是面向连接的协议。

实际上，一个在源端，一个在目的端，序号的使用维持了连接。

\begin{compactitem}
\item 接收端的数据包到达的顺序错了或丢失了时，将被重新发送。
\item 接收端的传输层不把次序错的数据包发送给应用进程。
\item 接收端保留消息中的所有数据包，直到它们以正确的次序被接收。
\end{compactitem}

TCP是数据通信中完美的传输层协议，但是不适合音频和视频的实时传输。例如，如果数据包丢失，TCP需要重新发送，这样就破坏了数据包的同步。

SCTP结合了UDP和TCP的优点来支持某些预期的Internet服务（例如因特网电话和视频流）。

\begin{compactitem}
\item SCTP适合用于音频和视频的实时传输；
\item SCTP提供差错控制和流量控制。
\end{compactitem}



视频会议可以提供两组或多组参与者或一组参与者之间进行交流，每个参与者或参与者小组使用客户端程序将视频和音频数据发送到视频会议服务器端，然后再由服务器将这些数据分发给所有的客户端。

在线聊天软件是和视频会议类似的实时应用，其实现原理和视频会议一样，区别只是用户规模。其中，有关的双方或多方可以交换文本、图片、音频和视频等，服务器接收到信息后再以很小的延迟进行数据中转，这样各方可以互相发送文本等来实现实时交互。





\chapter{Email}



Email（电子邮件）是两个实体间的消息交换，不能被客户端进程和服务器端进程支持。

\begin{compactitem}
\item Email的发送端可以是一个客户端程序；
\item Email的接收端不可能是相应的服务器；
\item Email服务器用于创建邮件排队系统来逐个发送电子邮件；
\item Email服务器为每个用户建立邮箱来保存邮件，直到被接收者取回。
\end{compactitem}


\section{SMTP}

当Email发送者需要发送邮件时，首先调用用户代理（UA）来准备消息，然后使用MTA（消息传送代理）发送消息到其邮件服务器。

\begin{quote}
\textsl{MTA是一个客户/服务器程序，客户端部分安装在Email发送者的主机上，服务器端部分安装在邮件服务器上，SMTP（简单邮件传输协议）用于完成MTA客户端和服务器端的工作。}
\end{quote}




Email处理系统必须有唯一的地址系统来分发邮件，其中SMTP使用的地址系统由两部分组成：本地部分和域名，中间用@符号隔开。
\begin{center}
\fbox{本地部分}\mbox{~@~}\fbox{域名}
\end{center}


Email地址的本地部分定义了指定文件的名字（即用户的邮箱），也是存储用户接收的所有Email的地方，同时也是用户代理取出邮件的地方。

实际上，邮件服务器可以使用一个或多个主机来接收和发送Email，而且邮件服务器的域名也是来自于DNS。

邮件服务器将从不同的邮件发送端接收到的消息统一放入队列中，每个消息可能去不同的目的地，客户/服务器MTA负责邮件服务器之间的邮件传输。

邮件到达邮件服务器后将会被存储在对应的邮箱中，直到消息被邮件接收者使用MAA（消息访问代理）取回，而且MAA也被设计为客户/服务器程序。

\begin{quote}
\textsl{MAA是一个客户/服务器程序，客户端部分安装在Email接收者的主机上，服务器端部分安装在邮件服务器上，邮件接收者使用POP3（邮局协议版本3）或IMAP（Internet邮件访问协议）从邮件服务器取回邮件。}
\end{quote}

实质上，从邮件发送者到邮件接收者之间的邮件来往是一个存储和取回的活动，用户之间地主要通信通过MTA客户端和MAA客户端来实现的。

\begin{compactitem}
\item MTA客户端程序是推入（Push）程序，用于将消息推入（上传）到邮件服务器。
\item MAA客户端程序是拉出（Pull）程序，用于将消息拉出（下载）到邮件客户端。
\item 用户不能使用发送端的MTA客户端和接收端的MTA服务器直接通信。
\end{compactitem}

SMTP是一个简单的邮件传输协议，它只能发送NVT（网络虚拟终端）7位ASCII格式的消息，不能为不支持7位ASCII字符的语言（例如法语、德语、希伯来语、俄语、汉语、韩语和日语等）使用，也不能用来发送二进制文件、音频或视频数据。

MIME（多用途Internet邮件扩充协议）允许非ASCII数据通过SMTP进行传输，但是MIME本身不是一个电子邮件协议，因此不能用来替代SMTP，只能作为SMTP的扩展。

\begin{compactitem}
\item 在邮件发送端，MIME把非ASCII数据转换为NVT ASCII数据，然后发送给SMTP的客户端，最后通过Internet进行发送。
\item 邮件接收端的SMTP服务器接收到NVT ASCII数据，并把它发送给MIME来转换为原始数据。
\end{compactitem}

用户可以把MIME看作是把非ASCII数据转换为ASCII数据（反之亦然）的一组软件功能。



\section{POP3}

POP3功能有限，客户端POP软件安装在邮件接收者的主机上，服务器端POP软件则安装在邮件服务器上。

客户端的邮件访问代理（MAA）发送用户名和密码邮件服务器来访问邮箱，然后用户可以逐个列出和取走邮件。

相比IMAP，POP3有如下的不足之处：

\begin{compactitem}
\item 不允许用户在服务器上组织邮件；
\item 用户无法在服务器上建立不同的文件夹，只能在本地主机上建立自定义文件夹；
\item 不允许用户在下载邮件前检查内容。
\end{compactitem}

\section{IMAP}

与POP3的功能相似，但是IMAP具有更多特性且更强大和复杂。

\begin{compactitem}
\item 用户可以在下载前检查邮件的头；
\item 用户可以在下载前搜索邮件的内容；
\item 用户可以部分下载邮件；
\item 用户可以在邮件服务器上创建、删除或重命名邮箱；
\item 用户可以在邮件服务器上建立不同的邮箱文件夹的层次结构。
\end{compactitem}


Listserv允许一组用户讨论感兴趣的共同话题，可以创建讨论组（Discussion Group）、新闻组（Usenet）来按话题等进行分组讨论，而且它本身也是客户/服务器应用，只是这里需要两个服务器程序（订阅者服务器和邮件服务器）来实现。



订阅者服务器检查和接受组的成员资格，用户可以向该服务器发送包含SUBSCRIBE请求的Email，订阅者服务器扫描Email来决定是否允许用户加入讨论组，然后订阅者服务器可以通过给用户发送Email来告知用户注册情况。

一个典型的订阅命令显示如下：
\begin{center}
SUBSCRIBE~mailer-server-e-mail-address~\textit{user-e-mail-address}
\end{center}

用户在订阅讨论组之后就可以向组发送Email，而且用户发送的是标有邮件服务器地址的Email，邮件服务器自动把Email发送给组中的每个成员。

如果需要取消订阅，用户可以向订阅者服务器发送UNSUBSCRIBE命令。例如，一个典型的取消订阅的命令如下：
\begin{center}
UNSUBSCRIBE~mailer-server-e-mail-address~\textit{user-e-mail-address}
\end{center}



\chapter{FTP}


FTP（文件传输协议）用于在不同的计算机之间进行拷贝和传输，但是不同的系统可能使用不同的命名约定，也可能使用不同的方式表示文本和数据，或者使用不同的目录结构，不过FTP使用非常简单完美的方案解决了所有这些问题。

与其他客户/服务器应用不同，FTP在客户端和服务器端之间建立两个连接。

\begin{compactitem}
\item 数据连接用来传输数据；
\item 控制连接用来控制信息（命令和响应）的交换。
\end{compactitem}

在使用FTP协议传输数据时，命令和数据的分开传输使得FTP效率更高。

在控制连接中使用非常简单的通信规则，一次只需要传输一行命令或一行响应，不过数据连接使用更为复杂的归来传输各种各样的数据。

FTP客户端由三个部分组成，分别是用户接口、客户端控制进程和客户端数据传输进程。

FTP服务器端由两部分组成，分别是服务器控制进程和服务器数据传输进程。



\begin{compactitem}
\item 数据连接建立在数据传输进程之间；控制连接建立在控制进程之间。
\item 控制连接在整个交互式FTP会话期间都是保持打开的，数据连接为每个文件传输打开和关闭。
\item 数据连接在涉及文件传输的命令被使用时就会被打开，在文件数据结束后就关闭数据连接。
\item 数据连接和控制连接使用不同的策略和不同的端口号。
\end{compactitem}

FTP服务器可以使用限制式策略和开放式策略，其中限制式FTP只允许指定的用户存取文件，用户使用账户和密码来控制存取，不允许公众在限制式FTP服务器上存取文件。

开放式FTP（又称为匿名FTP）允许任何人存取文件，用户可以使用anonymous作为用户名，guest作为密码，只是用户在匿名FTP中可以执行的操作很有限。

\begin{compactitem}
\item 匿名FTP可以只允许用户使用FTP命令的子集。
\item 匿名FTP可以只允许用户拷贝文件。
\item 匿名FTP可以不允许用户在文件系统中浏览。
\end{compactitem}




TFTP（简单文件传输协议）只能建立单个连接，因此可以允许用户快速传输小文件，不需要使用FTP的全部功能。








\chapter{Telnet}



Telnet（Terminal Network）是通用的多用途客户/服务器程序，它允许用户访问远程计算机上的任何应用程序，因此用户可以使用Telnet建立与远程主机的连接并登录远程主机，然后在远程主机上执行操作，同时把结果传回本地计算机。


当用户登录本地分时系统时称为本地登录，用户的操作可以被终端驱动程序接收，终端驱动程序把字符传送给操作系统，操作系统依次解释字符的组合，然后调用所需的应用程序或工具。

远程登录的机制不同于本地登录，操作系统需要对特殊的字符赋予特殊的含义。例如，UNIX操作系统的某些字符有其特殊的含义，它们在本地登录时不会带来任何问题，终端仿真程序和终端驱动程序知道字符或字符组合的确切含义，但是在远程登录中就会发生问题。

\begin{compactitem}
\item ctrl+z代表“挂起”；
\item ctrl+c代表“中止”；
\item ctrl+d代表“输入结束”。
\end{compactitem}

如果Telnet执行远程登录，用户击键产生的命令被传送给终端驱动程序，本地操作系统接收它们但不进行解释。

\begin{compactitem}
\item Telnet客户端接收用户输入的ASCII字符组成的命令，并且把它们转换为NVT字符，然后发送给本地TCP/IP协议栈。
\item Telnet服务器端把每个NVT字符转换为ASCII字符，然后传送给伪终端驱动程序。
\end{compactitem}

\chapter{WWW}


WWW（World Wide Web，万维网）或“Web”是连接分布在世界各地的知识库，而且不同于Internet提供的其他服务，WWW同时具有灵活性、可移植性和用户友好等特性，而且WWW已经进化为一种分布式客户/服务器服务。

\begin{compactitem}
\item 客户使用Web浏览器访问WWW服务；
\item Web站点可以提供WWW服务。
\end{compactitem}

WWW使用超文本和超媒体的概念来传送文本、图片、图形和声音等，因此超文本或超媒体的基本单元称为页面（page），根页面也就是主页（home page）。

Web浏览器用来解释和显示Web文档，而且所有的Web浏览器使用了几乎相同的体系结构，每个浏览器通常由控制器、客户端程序和解释器三部分组成。

\begin{compactitem}
\item 控制器接收来自键盘或鼠标的输入；
\item 客户端程序使用网络协议（例如FTP、Telnet、HTTP）来存取文档；
\item 控制器使用解释器在屏幕上显示文档。
\end{compactitem}

Web服务器存储所有属于Web站点的页面，并且基于页面的内容被确定的时间可以分为静态文档、动态文档和活动文档三大类。

\begin{compactitem}
\item 静态文档是内容固定的文档，在创建后就存储在服务器中。
\item 动态文档是在服务器接收到请求后通过运行创建动态文档的应用程序来产生的，而且服务器把程序的输出作为对请求文档的浏览器的响应。
\item 活动文档是可以在客户端运行的脚本，可以用来产生动画或与用户进行交互。
\end{compactitem}

静态文档的内容在创建时就确定了，而不是在使用时确定的，客户端只能获得静态文档的副本，并且可以使用浏览器来显示静态文档。

在Web应用中，任何时刻只要浏览器请求文档，Web服务器就会创建动态文档。

动态文档是为每次请求而创建的，其内容可以是随请求而变化的，因此客户端可以通过请求服务器运行应用程序，并把程序的结果发送给客户端。例如，CGI（通用网关接口）可以创建和处理动态文档，并且定义了使用不同的语言（C、C++、bash、Tcl、Perl等）进行文档编写、数据输入、结果输出等的标准。

动态文档中的大部分都是固定的，不随请求而改变，因此CGI等动态应用技术的缺陷就是效率。例如，假设需要在Web中检索备用零件表、供应量和价格，虽然供应量和价格会随时间而变，但是零件的名字、描述和图片是固定的，不过使用CGI仍然必须在每次请求时动态创建整个文档。

现在的Web应用开发技术支持使用HTML来创建包含固定部分的文档并嵌入必要的脚本，这样服务器在处理动态文档时可以运行包含的脚本来生成最终结果。

\begin{lstlisting}[language=PHP]
<html>
<head>
	<link rel="stylesheet" type="css/text" href="style.css" />
	<script type="text/javascript" src="test.js"></script>
	<title>test</title>
</head>
<body>
<?php
echo phpinfo();
?>
</body>
</html>
\end{lstlisting}

对于许多应用来说，在客户端需要运行程序或脚本来创建动画或与用户交互，浏览器请求活动文档后就会接收到服务器返回的活动文档的副本，然后活动文档在客户端浏览器的控制下运行，因此可以将活动文档看作是运行在客户端的程序。


\begin{compactitem}
\item 使用Java语言开发的Java applet可以在服务器上编译为字节码格式，客户端进程（浏览器）创建applet的实例并运行。
\item 使用JavaScript语言开发的脚本（文本）可以在客户端浏览器解释和执行。
\end{compactitem}





\section{HTTP}

HTTP（超文本传输协议）使用纯文本、超文本、音频和视频等形式来传输万维网中的数据，而且HTTP可以在超链接之间跳转。

Web浏览器的客户端发送HTTP请求到Web服务器，服务器发送回响应给客户端，在请求和响应消息中包含MIME格式的文字等信息。

\begin{compactitem}
\item HTTP请求中包含在基于文本的请求消息中。
\item HTTP响应也是基于文本的。
\item HTTP响应中包含被请求的文件内容或其他信息。
\end{compactitem}

在Web浏览器的客户端和Web服务器之间的HTTP事务中，客户端通过发送请求消息初始化事务，服务器通过返回响应来进行回应。


\section{URL}

URL（统一资源定位符）是用于指定Internet上任何类型的信息的标准，在其中定义了方法、主机、端口号和路径。

\begin{center}
\fbox{方法}://\fbox{主机}:\fbox{端口号}/\fbox{路径}
\end{center}

\begin{compactitem}
\item 方法是存取Web文档使用的协议（例如HTTP、HTTPS）；
\item 主机是信息所在的Web服务器，而且可以给Web主机任何命名；
\item 端口号代表Web服务器开放的接收请求和返回响应的端口；
\item 路径代表信息所处的文件路径名，路径中使用斜杠来把目录和子目录以及文件进行分隔。
\end{compactitem}



\section{HTML}

Web服务器返回给Web浏览器的响应是使用HTML（超文本标记语言）创建的Web页面，HTML允许在文档内部嵌入格式化指令，指令包含在文本中。

HTML对主文本和格式化指令都只使用ASCII字符，这样所有的Web浏览器都能识别HTML，并按照运行浏览器的操作系统来格式化显示内容。


\begin{compactitem}
\item HTML格式化指令可以被浏览器用来格式化数据，主文本是数据；
\item XML在给文档增加格式化能力的同时，还可以定义数据的类型
\end{compactitem}

Web页面由头（head）和体（body）两部分组成，其中头是Web页面的的一部分，头包含页面的标题和浏览器要使用的其他参数。

Web页面的实际内容在体部分，其中包含文本和标签。

\begin{compactitem}
\item 文本是包含在页面中的实际信息；
\item 标签定义了文档的外观。
\end{compactitem}


数字化照片或图形图像等非文本信息实际上不是HTML文档的一部分，不过可以使用图像标签<img>指向包含照片和图像的文件，这样图像标签就定义了要存取的图像的地址（URL），而且还指定了存取后图像应该如何被插入。

万维网使用超链接标签<a>可以把所有的文档链接到一起，任何项（例如字、词、段落或图像等）都可以通过锚机制来链接到其他文档，而且锚指向的文档可以和原文档存储在相同（或不同）的服务器上。



\section{XML}


HTML可以给文档增加格式化能力，但是没有定义数据的类型，XML可以定义文本的内容（类型）。

\begin{compactitem}
\item 在HTML中，标签定义格式，文本定义值。
\item 在XML中，标签定义类型，文本定义值。
\end{compactitem}

用户使用XML在Web页面上定义数据类型，从而使搜索更为容易。例如，搜索引擎搜索XML文档比HTML文档要快，而且XML还允许不同的组织定义特定的应用。

\begin{compactitem}
\item CML（化学标记语言）使用XML来定义物质的结构；
\item MathML使用XML来显示数学符号和关系等。
\end{compactitem}









































